/**
 * @name: 系统访问许可证
 * @tip: 包括鉴权及登录状态验证等
 */
import Vue from 'vue'

var _this = new Vue();

/**
 * 鉴权操作，包括设置、验证token，获取用户信息等
 */
import cookies from 'vue-cookies'

//token在cookie中存储的索引名
const TokenKey = 'token';
const roletype='roletype';
const isMain = 'isMain';
const roleAuthBtns = 'roleAuthBtns'

export function getToken() {
	return localStorage.getItem(TokenKey)
}

export function setToken(token) {
	//本系统以关闭浏览器之前为有效期
	return localStorage.setItem(TokenKey, token, 0)//0为浏览器会话结束时过期
}

//将用户的权限按钮存储至cookie
export function setroleAuthBtns(arr) {
	return cookies.set(roleAuthBtns,arr,0);
}

//获取登录账号是否为子账号-0为子账号-1为主账号
export function getisMain() {
	return cookies.get(isMain)
}

export function setisMain(Main) {
	//本系统以关闭浏览器之前为有效期
	return cookies.set(isMain, Main, 0)//0为浏览器会话结束时过期
}

//登录账号是否为资金归集方
export function setroletype(type) {
	//本系统以关闭浏览器之前为有效期
	return cookies.set(roletype, type, 0)//0为浏览器会话结束时过期
}
export function getroletype() {
	return cookies.get(roletype)
}

export function checkToken() {
	return cookies.isKey(TokenKey)
}

export function removeToken() {
	return localStorage.removeItem(TokenKey)
	// return cookies.remove(TokenKey)
}

//用户信息在session中存储的索引名
const UserKey = 'userinfo';

export function setUserinfo(str) {
	localStorage.setItem(UserKey, str);
}

export function getUserinfo() {
	let info = localStorage.getItem(UserKey);
	_this.$store.commit('setUserinfo', info);
}

/**
 * 登录状态检测
 * ——如果没有登录或者登录状态失效，则停留在登录页面
 * ——如果已经登录，访问登录页地址时，跳转到首页或已记录的上一页
 */
import router from '@/router'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style

const whiteList = ['/login', '/404'];  //免登录页面白名单

NProgress.configure({ showSpinner: false }); //禁用进度环

router.beforeEach(async (to, from, next) => {
	// start progress bar
	NProgress.start();
	//路由发生变化，设置页面title
	document.title = to.meta.title ? to.meta.title : '功能页';
	//存取最上层的父级路由至vuex中做头部导航的状态判断
    let arr = to.path.split('/');
    let headerBar = '/'+arr[1];
	_this.$store.commit('setheaderBar',headerBar);
	if(arr[2]){
		_this.$store.commit('setsiderbarOne',arr[2]);
	}else{
		_this.$store.commit('setsiderbarOne','');
	}
	if(arr[3]){
		_this.$store.commit('setsiderbarTwo',arr[3]);
	}else{
		_this.$store.commit('setsiderbarTwo','');
	}

	//确定用户是否已登录
	const hasToken = getToken();
	if(hasToken) {
		if(to.path === '/login') {
			//如果已登录，则重定向到主页
			next({ path: '/' });
			NProgress.done();
		} else {
			//在进入功能页面前，先检查是否获取用户信息，因为菜单是需要根据用户身份动态渲染的
			const hasUserInfo = _this.$store.state.userinfo; //根据vuex中的用户信息判断
			if(hasUserInfo) {
				next();
			} else {
				try {
					//获取用户信息
					await getUserinfo();
					next();
				} catch (error) {
					//删除token，并跳转到登录页面重新登录
					await removeToken();
					await setUserinfo('');
					_this.$message.error(error || 'Has Error');
					next(`/login?redirect=${to.path}`);
					NProgress.done();
				}
			}
		}

	} else {
		return  next();
		/* has no token*/
		if(whiteList.indexOf(to.path) !== -1) {
			//在免登录白名单中，直接进入
			next();
		} else {
			//其他无权访问的页面将重定向到登录页面
			setUserinfo('');
			// next(`/login`);
			next(`/login?redirect=${to.path}`);//这个是重定向路由，登录状态失效后触发--记录前一个界面路由
			NProgress.done();
		}
	}
});

router.afterEach(() => {
	NProgress.done();
	// document.title="运营商";
});
